home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
comm
/
pccp019.zip
/
TERM.C
< prev
next >
Wrap
Text File
|
1992-05-09
|
20KB
|
976 lines
/* Copyright (C) 1992 Peter Edward Cann, all rights reserved.
* MicroSoft QuickC: >qcl term.c graphics.lib
*/
#include<stdio.h>
#include<bios.h>
#include<dos.h>
#include<fcntl.h>
#include<graph.h>
#include"emu.h"
#include"color.h"
#define DLLSBREG 0
#define DLMSBREG 1
#define INTCTLREG 1
#define INTIDREG 2
#define LCTLREG 3
#define MCTLREG 4
#define STATREG 5
#define INTACK 0x20
#define DB7 0x02
#define DB8 0x03
#define STOP2 0x04
#define PARITYEN 0x08
#define PARITYEVEN 0x10
#define DLAB 0x80
#define INTBASE1 0x20
#define INTMASK1 0x21
#define INTBASE2 0xa0
#define INTMASK2 0xa1
#define TBUFSIZ 8192
int index, basereg;
unsigned char buf[TBUFSIZ];
unsigned char diffintmask, irqnum;
void (interrupt far *oldvect)();
void interrupt far inthndl(_es, _ds, _di, _si, _bp, _sp,
_bx, _dx, _cx, _ax, _ip, _cs, _flags)
unsigned _es, _ds, _di, _si, _bp, _sp;
unsigned _bx, _dx, _cx, _ax, _ip, _cs, _flags;
{
if(inp(basereg+STATREG)&0x01)
{
buf[index++]=inp(basereg)&0xff;
index=index%TBUFSIZ;
}
outp(INTBASE1, INTACK);
outp(INTBASE2, INTACK);
}
unsigned char lctl;
dispkbd(code)
unsigned short code;
{
int i;
long tstamp, tstamp1, dayofticksp;
unsigned char ccode, scode;
ccode=code&0xff;
scode=(code>>8)&0xff;
if(ccode)
{
while(!(inp(basereg+STATREG)&0x20));
outp(basereg, code);
}
else
if(!emu.keys[scode].len)
putch(0x07);
else
for(i=0;i<emu.keys[scode].len;i++)
{
while(!(inp(basereg+STATREG)&0x20));
if(emu.keys[scode].nullpause_p&&!emu.keys[scode].chars[i])
{
_bios_timeofday(_TIME_GETCLOCK, &tstamp);
dayofticksp=0;
while(1)
{
if(_bios_timeofday(_TIME_GETCLOCK, &tstamp1))
dayofticksp+=20*60*60*24;
if(tstamp1+dayofticksp-tstamp>22)
break;
}
}
else if(emu.keys[scode].nullpause_p&&(emu.keys[scode].chars[i]==0xff))
{
_bios_timeofday(_TIME_GETCLOCK, &tstamp);
outp(basereg+LCTLREG, lctl|0x40);
dayofticksp=0;
while(1)
{
if(_bios_timeofday(_TIME_GETCLOCK, &tstamp1))
dayofticksp+=20*60*60*24;
if(tstamp1+dayofticksp-tstamp>10)
break;
}
outp(basereg+LCTLREG, lctl);
}
else
outp(basereg, emu.keys[scode].chars[i]);
}
}
#define LISTSIZ 16
struct
{
short index;
short row;
short column;
short list[LISTSIZ];
short listindex;
}
funcstor[NFUNCS];
clrfuncstor(seqn)
short seqn;
{
int i;
for(i=funcstor[seqn].listindex-1;i>=0;i--)
funcstor[seqn].list[i]=0;
funcstor[seqn].row=funcstor[seqn].column=funcstor[seqn].listindex=funcstor[seqn].index=0;
}
int bold, faint, blink, inverse, bkcolor, fgcolor;
struct videoconfig far *vconf;
atthndl()
{
int adds, workingbk, workingfg;
adds=0;
if(vconf->adapter!=_MDPA)
{
workingbk=bkcolor;
workingfg=fgcolor;
if(faint)
if(inverse)
if(bkcolor==WHITE)
workingbk=GRAY;
else
adds+=FAINTADD;
else
if(fgcolor==WHITE)
workingfg=GRAY;
else
adds+=FAINTADD;
else
if(bold)
{
if(bkcolor==WHITE)
workingbk=BWHITE;
if(fgcolor==WHITE)
workingfg=BWHITE;
}
if(blink)
adds+=BLINKADD;
if(inverse)
{
if(blink)
_settextcolor(workingbk+BLINKADD);
else
_settextcolor(workingbk);
if(faint)
_setbkcolor((long)(workingfg+FAINTADD));
else
_setbkcolor((long)workingfg);
}
else
{
_settextcolor(workingfg+adds);
_setbkcolor((long)workingbk);
}
}
else
{
workingbk=BLACK;
if(bold&&!inverse)
workingfg=M_UNDER;
else
if(inverse)
workingfg=WHITE;
else
workingfg=M_NORMAL;
if(faint)
adds+=FAINTADD;
if(blink)
adds+=BLINKADD;
if(inverse)
{
if(blink)
_settextcolor(workingbk+BLINKADD);
else
_settextcolor(workingbk);
_setbkcolor((long)workingfg);
}
else
{
_settextcolor(workingfg+adds);
_setbkcolor((long)workingbk);
}
}
}
ansiatthndl(seqn)
short seqn;
{
int i, adds, workingbk, workingfg;
if(emu.funcs[seqn].func==ANSIATTRIB)
for(i=0;i<funcstor[seqn].listindex;i++)
switch(funcstor[seqn].list[i])
{
/*at the moment this is strictly ANSI subset*/
case 0:
bkcolor=BLACK;
fgcolor=WHITE;
bold=faint=blink=inverse=0;
break;
case 1:
bold=1;
break;
case 2:
faint=1;
break;
case 5:
case 6:
blink=1;
break;
case 7:
inverse=1;
break;
case 8:
case 30:
case 40:
fgcolor=bkcolor;
break;
case 31:
case 41:
fgcolor=RED;
break;
case 32:
case 42:
fgcolor=GREEN;
break;
case 33:
case 43:
fgcolor=YELLOW;
break;
case 34:
case 44:
fgcolor=BLUE;
break;
case 35:
case 45:
fgcolor=MAGENTA;
break;
case 36:
case 46:
fgcolor=CYAN;
break;
case 37:
case 47:
fgcolor=WHITE;
break;
default:
break;
}
atthndl();
}
int wrap_p;
wrapctl()
{
if(wrap_p)
_wrapon(_GWRAPON);
else
_wrapon(_GWRAPOFF);
}
unsigned int speed, comnum;
char databits, parity, stopbits, fpname[256], dribpname[256];
updstatus()
{
struct rccoord posptr;
short tc;
long bc;
char str[80];
posptr=_gettextposition();
tc=_gettextcolor();
bc=_getbkcolor();
_settextwindow(1,1,1,80);
_settextposition(1,1);
_settextcolor(BLACK);
_setbkcolor((long)WHITE);
_wrapon(_GWRAPOFF);
sprintf(str, "Both Shifts to Exit COM%u %5u %c%c%c %22s %22s",
comnum+1, speed, databits, parity, stopbits, fpname, dribpname);
_outtext(str);
_settextwindow(2,1,25,80);
wrapctl();
_settextcolor(tc);
_setbkcolor(bc);
_settextposition(posptr.row, posptr.col);
}
int graphics;
showchar(c)
char c;
{
char str[2];
if(graphics)
if(emu.gchars[c])
c=emu.gchars[c];
str[0]=c;
str[1]='\0';
_outtext(str);
}
perffunc(seqn)
short seqn;
{
struct rccoord posptr;
int i;
switch(emu.funcs[seqn].func)
{
case CLEAR:
_clearscreen(_GCLEARSCREEN);
updstatus();
_settextposition(1,1);
break;
case HOME:
_settextposition(1,1);
break;
case CLREOL:
posptr=_gettextposition();
_wrapon(_GWRAPOFF);
for(i=posptr.col;i<=80;i++)
_outtext(" ");
_settextposition(posptr.row, posptr.col);
wrapctl();
break;
case UP:
posptr=_gettextposition();
if(posptr.row>1)
_settextposition(posptr.row-1, posptr.col);
break;
case DOWN:
posptr=_gettextposition();
if(posptr.row<24)
_settextposition(posptr.row+1, posptr.col);
else
{
showchar('\n');
_settextposition(posptr.row, posptr.col);
}
break;
case LEFT:
posptr=_gettextposition();
if(posptr.col>1)
_settextposition(posptr.row, posptr.col-1);
break;
case RIGHT:
posptr=_gettextposition();
if(posptr.col<80)
_settextposition(posptr.row, posptr.col+1);
break;
case GOTO:
if(funcstor[seqn].row<1)
funcstor[seqn].row=1;
if(funcstor[seqn].row>24)
funcstor[seqn].row=24;
if(funcstor[seqn].column<1)
funcstor[seqn].column=1;
if(funcstor[seqn].column>80)
funcstor[seqn].row=80;
_settextposition((emu.tophi_p?25-funcstor[seqn].row:funcstor[seqn].row), funcstor[seqn].column);
break;
case NORMAL:
fgcolor=WHITE;
bkcolor=BLACK;
blink=faint=bold=inverse=0;
atthndl();
break;
case BLINK:
blink=1;
atthndl();
break;
case NOBLINK:
blink=0;
atthndl();
break;
case BOLD:
bold=1;
atthndl();
break;
case NOBOLD:
bold=0;
atthndl();
break;
case FAINT:
faint=1;
atthndl();
break;
case NOFAINT:
faint=0;
atthndl();
break;
case INVERSE:
inverse=1;
atthndl();
break;
case NOINVERSE:
inverse=0;
atthndl();
break;
case UPN:
posptr=_gettextposition();
if(posptr.row-funcstor[seqn].row<1)
_settextposition(1, p